package com.sunrise.estoque.repositorio;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.sunrise.estoque.repositorio.iface.MovimentacaoEstoqueDao;
import com.sunrise.generico.acesso.DaoService;
import com.sunrise.generico.entidade.MovimentacaoEstoque;
import com.sunrise.generico.enums.StatusMovimentacao;

@Repository
public class MovimentacaoEstoqueDaoImpl extends DaoService<MovimentacaoEstoque>
		implements MovimentacaoEstoqueDao {

	public List<MovimentacaoEstoque> listarOrdenado() {
		List<MovimentacaoEstoque> list = listar(MovimentacaoEstoque.class);
		Collections.sort(list, new Comparator<MovimentacaoEstoque>() {

			@Override
			public int compare(MovimentacaoEstoque o1, MovimentacaoEstoque o2) {
				return o1.getDescricao().compareTo(o2.getDescricao());
			}
		});
		return list;
	}

	public List<MovimentacaoEstoque> search(MovimentacaoEstoque ex) {
		List<MovimentacaoEstoque> list = searchByExample(
				MovimentacaoEstoque.class, ex);
		Collections.sort(list, new Comparator<MovimentacaoEstoque>() {

			@Override
			public int compare(MovimentacaoEstoque o1, MovimentacaoEstoque o2) {
				return o1.getDescricao().compareTo(o2.getDescricao());
			}
		});
		return list;
	}

	public MovimentacaoEstoque getById(Long id) {
		return getById(id, MovimentacaoEstoque.class);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<MovimentacaoEstoque> listarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(MovimentacaoEstoque.class);
		crit.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE));
		return crit.list();
	}

	@Override
	public MovimentacaoEstoque buscarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(MovimentacaoEstoque.class);
		crit.add(Restrictions.eq("nome", nome).ignoreCase());
		return (MovimentacaoEstoque) crit.uniqueResult();
	}

	@SuppressWarnings("unchecked")
	@Override
	public Collection<MovimentacaoEstoque> buscarPorFiltros(Date filtroDataMovimentacao, String filtroNomeProduto,
			StatusMovimentacao filtroStatusMovimentacao, Integer numeroNotaFiscal, Long idFilial) {
		Criteria crit = getSession().createCriteria(MovimentacaoEstoque.class);
		
		if(filtroNomeProduto != null && filtroNomeProduto != ""){
			crit.createAlias("movimentacoesProduto", "movProd");
			crit.createAlias("movProd.produto", "prod");
			crit.add(Restrictions.like("prod.nome", filtroNomeProduto).ignoreCase());
		}
		
		if(filtroDataMovimentacao != null){
//			crit.add(Restrictions.ge("", value));
		}
		
		if(filtroStatusMovimentacao != null){
			crit.add(Restrictions.eq("statusMovimentacao", filtroStatusMovimentacao));
		}
		
		if(numeroNotaFiscal != null && numeroNotaFiscal != 0){
			crit.createAlias("notaFiscal", "nf");
			crit.add(Restrictions.eq("nf.numero", numeroNotaFiscal));
		}
		
		crit.createAlias("filial", "fil");
		crit.add(Restrictions.eq("fil.id", idFilial));
		
		if(idFilial == null){
			return new ArrayList<MovimentacaoEstoque>();
		}
		
		return crit.list();
	}

}
